在前十五天的挑戰中,我們簡單討論了一些資安相關的概念:
從 input、redirect、css 相關的攻擊到 Node.js 的安全實踐,我們看到了前端有可能會出現的攻擊,以及後端 Node.js 官方所介紹的安全實踐範例。
在接下來的挑戰中,我們將要來建立一個 Node.js 的 App,將會實現認證和授權相關的功能。
但在正式建立 App 之前,我們會先看一下大致上要做的事情,以及需要避免的設計以及其原因,就讓我們開始吧!
有關登入頁面的設計,我們會需要注意的部分就是 警示訊息 warning message
& HTTP 回應的時間
。
詳細注意事項:
避免確切的用戶登入失敗的警示訊息
當用戶登入失敗時,確定返回 "No such username or password",不要返回確切訊息。
原因:
因為假設在使用者輸入"沒有存在的用戶 username" 時,返回 "沒有這個 username",或許使用者體驗提升了,但有可能會讓攻擊者可以知道這個系統 "不存在" 哪些用戶,而排除那些攻擊名單,進而更容易鎖定攻擊目標。
確保 HTTP 回應時間無存在差異
確保時間回應對於 username 沒有存在是不會因為 “沒有存在 username” 而有所差異的。
原因:
同上述第一點,有可能可以藉此讓攻擊者知道沒有存在某些用戶。
有關註冊頁面,我們需要注意的是 密碼需要加密儲存
& 警示訊息 warning message
。
詳細注意事項:
密碼需要加密儲存
在進行註冊的時候,SAVE 進 DB 的 user 密碼需要是被加密後的字串。
原因:
因為攻擊者若能連線進你的 DB,所有人的密碼若是明文就很有可能會被看光光,超級危險。
保有一定的註冊密碼長度限制
通常我們在使用商業應用程式時,可以看到不同的應用程式都會有屬於他們的 password policy,
但最基本就是會對密碼做一個 min length 的限制,避免密碼太過簡單。
避免確切的用戶註冊失敗的警示訊息
當用戶註冊失敗時,避免告訴別人說 "username 已經被註冊"
原因:
因為假設在使用者輸入"已存在的用戶 username" 時,返回 "username 已經被註冊" 可能會讓攻擊者可以知道這個系統 "存在" 哪些用戶,進而更容易鎖定攻擊目標。
當有人嘗試將以註冊的 email 重新註冊時,寄送 password reset email 給 user,提醒他有人嘗試可能要攻擊他的帳號竊取資訊。
如果你的 username 並不是 email addresses,可以使用 CATCHA 來保護你的註冊頁面
備註:
此次的實作會視情況涵蓋 4、5 點,若時間有餘裕會增加其功能~
這次介紹了登入頁面、註冊頁面的注意事項,下次會介紹我們將會使用到的 JWT (用來做使用者驗證) ~
不得不說掌握進度真的有點困難,希望能順利產出程式碼 TAT